# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/8/27 0027 23:37
@Author : 测试开发工程师
@File : 4. 简单工厂.hasattr_demo.py
@Software: PyCharm
============================
"""

# ---- 问题： 创建对象的代码比较多，可能还有 text ， md , yaml 等
# ----- 解决方案： 把对象的创建移动到其他类中， load 方法就会很简洁   -  简单工厂

# Demo 用于加载不同的文件，对不同的文件作不同的处理
class Demo:
    def load(self,rule):

        parse = ParseRuleFactory().create_parse(rule)
        # 调用对象的方法进行操作
        parse.parse()

# 简单工厂类，用于实例的创建。根据 rule 创建不同的实例。本质就是把 Demo 中原来创建实例的代码，给迁移过来
class ParseRuleFactory:
    def create_parse(self,rule):
        parse = None
        # 根据不同的 rule ，创建不同的对象
        if 'xml' == rule:
            parse = XmlParse()
        elif 'json' == rule:
            parse = JsonParse()
        elif 'excel' == rule:
            parse = ExcelParse()
        elif 'csv' == rule:
            parse = CsvParse()
        else:
            parse = OtherParse()
        return parse

# 相当于接口，用于规范各个解析类
# 每个解析类都要实现 parse 方法，否则 在调用的时候就会报错
class IParse:
    def parse(self):
        raise ValueError()

class XmlParse(IParse):
    def parse(self):
        print('XmlParse')

class JsonParse(IParse):
    def parse(self):
        print('JsonParse')

class ExcelParse(IParse):
    def parse(self):
        print('ExcelParse')

class CsvParse(IParse):
    def parse(self):
        print('CsvParse')

class OtherParse(IParse):
    def parse(self):
        print('OtherParse')

if __name__ == '__main__':
    Demo().load('json')